package com.javastudy.liuhouse.jdbc18;

import org.junit.Test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class jdbcshiwu {
    //JDBC连接的URL,不同的数据库有不同的格式
    private String JDBC_URL = "jdbc:mysql://localhost:3306/learnjdbc?useSSL=false&characterEncoding=utf8";
    private String JDBC_USER = "root";
    private String JDBC_PASSWORD = "root";
    @Test
    public void testShiwu1(){
        Connection connection = null;
        try{
            //项目在初始化的时候已经加载好了数据库驱动
            //当然 咱们这边也可以主动的加载数据库驱动
            Class.forName("com.mysql.jdbc.Driver");
            //获取数据库的连接资源
            connection = DriverManager.getConnection(JDBC_URL , JDBC_USER , JDBC_PASSWORD);
            System.out.println(connection);
            //关闭自动提交，开启事务
            connection.setAutoCommit(false);
            //执行转账操作
            //因为是在类的内部,所以可以直接调用 private修饰的方法
            //把1账户的钱转到2账户 转账200元
            transferMoney(connection , 1 , 2 , 200.00);
            //4.提交事务
            connection.commit();
            System.out.println("转账成功");
        }catch (Exception e){
            //如果发生异常的话，就要回滚事务
            if(connection != null){
                try{
                    connection.rollback();
                    System.out.println("转账失败,事务已经回滚");
                }catch (SQLException ex){
                    ex.printStackTrace();
                }
            }
            e.printStackTrace();
        }finally {
            //7.关闭连接,不管执行成功或者不成功  都要执行关闭操作
            if(connection != null){
                try {
                    connection.close();
                } catch (SQLException e) {
                    throw new RuntimeException(e);
                }
            }
        }
    }


    //执行转账操作，这是内部使用的
    private static void transferMoney(Connection connection , int fromAccountId , int toAccountId , double amount){
        try {
            //1.从原账户扣除金额
            String sql1 = "UPDATE accounts set balance = balance - ? where id = ?";
            PreparedStatement statement1 = connection.prepareStatement(sql1);
            //给预定的位置进行赋值操作
            statement1.setDouble(1 , amount);
            statement1.setInt(2 , fromAccountId);
            statement1.executeUpdate();

            //向目标账户增加金额
            String sql2 = "UPDATE accounts set balance = balance + ? where id = ?";
            PreparedStatement statement2 = connection.prepareStatement(sql2);
            statement2.setDouble(1 , amount);
            statement2.setInt(2 , toAccountId);
            statement2.executeUpdate();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }



}
